#ifndef __MY_TIMER_H
#define __MY_TIMER_H

#include "bsp_port.h"

#define TIM_TASK_MAX 10 // 最大定时任务数

// 定时器可能的状态
typedef enum
{
  Ti_STOP,  // 停止
  Ti_RUN,   // 运行
  Ti_RESET, // 重置
} Ti_State;

// 软定时器
typedef struct
{
  uint32_t nowTimer;   // 此刻的时间
  uint32_t agoTimer;   // 之前的时间
  uint16_t Cycle;      // 周期
  int16_t RepeatCount; // 重复的次数 n<=0 : 无限;  n>0: 剩余的 时间     默认n=0
  uint16_t LeftCount;  // 剩余次数  默认n=0
  Ti_State State;      // 定时器可能的状态 暂停 恢复 重置   默认暂停
  void (*event)(void); // 定时要执行的函数
} bsp_TIM_t;

extern uint32_t msValueIRQ; // 非阻塞延时 ms

void bsp_Ti_IRQHandler(void);
void bsp_Ti_All_Handle(void);
void bsp_Ti_Debug(void);
void bsp_Ti_Set_mDelay(uint32_t msValue);
uint32_t bsp_Ti_Get_mDelay(void);
void bsp_Ti_Set_mDelay_Pause(void);
void bsp_Ti_Set_mDelay_Renew(void);

uint8_t Ti_obj_New(bsp_TIM_t *obj, uint16_t cycle, Ti_State en, void (*function)(void));

void Ti_Obj_Destroy(bsp_TIM_t *obj);
void Ti_obj_Activate(bsp_TIM_t *obj);                  // 定时器对象激活
void Ti_obj_Handle(bsp_TIM_t *obj);                    // 定时器对象处理函数
void Ti_obj_Set_Stop(bsp_TIM_t *obj);                  // 定时器对象 停止
void Ti_obj_Set_Run(bsp_TIM_t *obj);                   // 定时器对象 运行
void Ti_obj_Set_Reset(bsp_TIM_t *obj);                 // 定时器对象 重置
void Ti_obj_Set_Count(bsp_TIM_t *obj, uint16_t value); // 设置目标定时器对象的重复次数
uint16_t Ti_obj_Get_Count(bsp_TIM_t *obj);
void Ti_obj_Set_Cycle(bsp_TIM_t *obj, uint16_t value);      // 重新设置定时器对象的周期
void Ti_obj_Set_event(bsp_TIM_t *obj, void (*event)(void)); // 设置定时对象的事件
Ti_State Ti_obj_Get_State(bsp_TIM_t *obj);

#endif
/************************************* 移   植  工  作  STM32G0 ************************************************/

#if 0
放到main.c文件中定时器初始化部分
LL_TIM_EnableCounter(TIMx);   // 使能计数
LL_TIM_EnableIT_UPDATE(TIMx); // 使能更新中断
LL_TIM_EnableAllOutputs(TIMx);
#endif

#if 0
放在定时器中断中
  if (LL_TIM_IsActiveFlag_UPDATE(TIMx) == SET)
  {
    bsp_Ti_IRQHandler();
  }
  LL_TIM_ClearFlag_UPDATE(TIMx); // 清除中断标志位

  main.c主循环中
  bsp_Ti_All_Handle();
#endif
/*****************************************************************************************************/
